/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package views;

import entities.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author facundo
 */
public class MovimientosCaja extends javax.swing.JFrame {

    public static JFrame frame;
    private final EntityManager entityManager;
    private String observacionesOperacion;
    private static Alquileres alquiler;
    private BusquedaAlquiler busquedaAlquiler;

    public JFrame getFrame() {
        return frame;
    }
    private Usuarios usuario;

    /**
     * Creates new form MovimientosCaja
     */
    public MovimientosCaja(Usuarios usuario) {
        initComponents();
        entityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        entityManager.getTransaction().begin();
        this.usuario = usuario;
        responsableField.setText(usuario.getNombre().toString());
    }

    private Integer identificarOperacion(String nombreOperacion) {
        Integer idOperacion = -1;
        
        for (Operaciones operacion : operacionesList) {
            if (operacion.getOperacion().equals(nombreOperacion)){
                idOperacion = operacion.getId();
            }
        }
        
        return idOperacion;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        SIAATPUEntityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        operacionesQuery = java.beans.Beans.isDesignTime() ? null : SIAATPUEntityManager.createQuery("SELECT o FROM Operaciones o");
        operacionesList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : operacionesQuery.getResultList();
        monedaQuery = java.beans.Beans.isDesignTime() ? null : SIAATPUEntityManager.createQuery("SELECT m FROM Moneda m WHERE m.activo = 'S'");
        monedaList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : monedaQuery.getResultList();
        movimientoCajaLabel = new javax.swing.JLabel();
        responsableLabel = new javax.swing.JLabel();
        responsableField = new javax.swing.JTextField();
        tipoOperacionLabel = new javax.swing.JLabel();
        tipoOperacionComboBox = new javax.swing.JComboBox();
        importeLabel = new javax.swing.JLabel();
        importeField = new javax.swing.JTextField();
        monedaComboBox = new javax.swing.JComboBox();
        registrarButton = new javax.swing.JButton();
        responsableLabel1 = new javax.swing.JLabel();
        observacionesField = new javax.swing.JTextField();
        buscarButton = new javax.swing.JButton();

        movimientoCajaLabel.setFont(new java.awt.Font("Verdana", 2, 18)); // NOI18N
        movimientoCajaLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/moneylogo.png"))); // NOI18N
        movimientoCajaLabel.setText("Movimiento de Caja");

        responsableLabel.setText("Responsable:");

        responsableField.setEditable(false);

        tipoOperacionLabel.setText("Tipo de Operación:");

        org.jdesktop.swingbinding.JComboBoxBinding jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, operacionesList, tipoOperacionComboBox);
        bindingGroup.addBinding(jComboBoxBinding);

        tipoOperacionComboBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tipoOperacionComboBoxActionPerformed(evt);
            }
        });

        importeLabel.setText("Importe:");

        jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, monedaList, monedaComboBox, "");
        bindingGroup.addBinding(jComboBoxBinding);

        registrarButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/getmoney.png"))); // NOI18N
        registrarButton.setText("Registrar Operación");
        registrarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                registrarButtonActionPerformed(evt);
            }
        });

        responsableLabel1.setText("Observaciones:");

        observacionesField.setEditable(false);
        observacionesField.setBackground(new java.awt.Color(255, 255, 255));

        buscarButton.setBackground(new java.awt.Color(255, 153, 51));
        buscarButton.setText("buscar");
        buscarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscarButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(registrarButton))
                    .addComponent(movimientoCajaLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(tipoOperacionLabel)
                            .addComponent(responsableLabel)
                            .addComponent(responsableLabel1)
                            .addComponent(importeLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(importeField, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(monedaComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                            .addComponent(tipoOperacionComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(responsableField)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(observacionesField, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(buscarButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(movimientoCajaLabel)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(responsableLabel)
                    .addComponent(responsableField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tipoOperacionLabel)
                    .addComponent(tipoOperacionComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(responsableLabel1)
                        .addComponent(observacionesField))
                    .addComponent(buscarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(importeLabel)
                    .addComponent(importeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(monedaComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE)
                .addComponent(registrarButton)
                .addContainerGap())
        );

        bindingGroup.bind();

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public static Operaciones getOperacion() {
        return (Operaciones) tipoOperacionComboBox.getSelectedItem();
    }

    public boolean verificarOperacion() {
        Operaciones operacionActual = (Operaciones) tipoOperacionComboBox.getSelectedItem();
        Double importe;
        if (operacionActual.getOperacion().equals("RETIRO DE EFECTIVO")) {
            if (observacionesField.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "Al retirar efectivo tiene que completar el campo OBSERVACIONES");
                observacionesField.requestFocus();
                return false;
            }
        } else {
            if (observacionesField.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "Por favor busque la referencia de esta operación.");
                buscarButton.doClick();
                return false;
            }
        }
        try {
            importe = Double.valueOf(importeField.getText().toString());
        } catch (NumberFormatException nfex) {
            JOptionPane.showMessageDialog(null, "Ingrese el importe del movimiento que desea realizar.");
            importeField.requestFocus();
            return false;
        }
        return true;
    }

    private Integer getIDMovimiento(Integer idResponsable, Date fecha) {
        Query queryIDMovimiento;
        Caja caja;
        queryIDMovimiento = entityManager.createNamedQuery("Caja.findByResponsableFecha");
        queryIDMovimiento.setParameter("responsable", idResponsable);
        queryIDMovimiento.setParameter("fecha", fecha);
        caja = (Caja) queryIDMovimiento.getSingleResult();
        return caja.getId();
    }

    private void limpiarBotones() {
        observacionesField.setText("");
        importeField.setText("");
    }

    private void registrarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_registrarButtonActionPerformed
        // FUNCION DE REGISTRO DE MOVIMIENTO EN LA BASE DE DATOS
        if (verificarOperacion() == false) {
            return;
        }
        Calendar cal = Calendar.getInstance();
        Date fecha = cal.getTime();
        entityManager.getTransaction().commit();
        entityManager.getTransaction().begin();
        observacionesOperacion = observacionesField.getText();
        Caja movCaja = new Caja();
        movCaja.setOperacion(((Operaciones) tipoOperacionComboBox.getSelectedItem()).getId());
        movCaja.setFecha(fecha);
        movCaja.setResponsable(usuario.getIdUsuario());
        movCaja.setImporte(Double.valueOf(importeField.getText().toString()));
        movCaja.setMoneda(((Moneda) monedaComboBox.getSelectedItem()).getClave());
        movCaja.setObservaciones(observacionesOperacion);
        if (movCaja.getOperacion() == identificarOperacion("RESERVA")) {
            alquiler.setTipoAlquiler("F");
        }
        if (movCaja.getOperacion() == identificarOperacion("DEVOLUCION DE EFECTIVO")) {
            if ((alquiler.getMontoReserva()-movCaja.getImporte()) < alquiler.getMontoTotal()){
                JOptionPane.showMessageDialog(null, "No puede devolver más efectivo que el excedente."
                        + "Como máximo puede devolver: "+(alquiler.getMontoReserva()-alquiler.getMontoTotal())+""
                        + " en esta operación.");
            }
            alquiler.setMontoReserva(alquiler.getMontoReserva() - movCaja.getImporte());
            entityManager.merge(alquiler);
        } else {
            if (movCaja.getOperacion() != identificarOperacion("RETIRO DE EFECTIVO")) {
                alquiler.setMontoReserva(alquiler.getMontoReserva() + movCaja.getImporte());
                entityManager.merge(alquiler);
            }
        }

        entityManager.persist(movCaja);
        entityManager.getTransaction().commit();
        entityManager.getTransaction().begin();
        Logs log = new Logs();
        log.setUsuario(usuario);
        Integer idMovimiento = getIDMovimiento(usuario.getIdUsuario(), fecha);
        log.setearObservaciones("Alta", "Movimiento de Caja", idMovimiento, "MovimientosCaja");
        log.setObservaciones(log.getObservaciones() + " - Detalles de Movimiento: Operación: " + tipoOperacionComboBox.getSelectedItem() + " - Observaciones: " + observacionesField.getText() + " - Importe: " + ((Moneda) monedaComboBox.getSelectedItem()).getClave() + importeField.getText() + ".");
        entityManager.persist(log);
        entityManager.getTransaction().commit();
        entityManager.getTransaction().begin();
        JOptionPane.showMessageDialog(null, "La operación de registro en caja fue exitosa", "Aviso", JOptionPane.INFORMATION_MESSAGE, null);
        limpiarBotones();
         VistaDisponibilidad.resetear(entityManager);
    }//GEN-LAST:event_registrarButtonActionPerformed

    private void buscarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscarButtonActionPerformed
        observacionesField.setText("");
        Operaciones operacion = (Operaciones) tipoOperacionComboBox.getSelectedItem();
        if (operacion.getOperacion().equals("RETIRO DE EFECTIVO")) {
            JOptionPane.showMessageDialog(null, "Al retirar efectivo tiene que completar el campo OBSERVACIONES");
            observacionesField.requestFocus();
            return;
        } else {
            if ((MenuPrincipal.frameCreado(busquedaAlquiler)) && (MenuPrincipal.frameCerrado(busquedaAlquiler.getFrame()))) {
                busquedaAlquiler = null;
            }
            if (!MenuPrincipal.frameCreado(busquedaAlquiler)) {
                busquedaAlquiler = new BusquedaAlquiler(usuario);
                if (!MenuPrincipal.frameCreado(busquedaAlquiler.getFrame())) {
                    busquedaAlquiler.main(usuario);
                }
            } else {
                if (!MenuPrincipal.frameVisible(busquedaAlquiler.getFrame())) {
                    MenuPrincipal.rearmarFrame(busquedaAlquiler.getFrame());
                }
                busquedaAlquiler.getFrame().toFront();
            }
        }
    }//GEN-LAST:event_buscarButtonActionPerformed

    private void tipoOperacionComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tipoOperacionComboBoxActionPerformed
        observacionesField.setText("");
        Operaciones operacion = (Operaciones) tipoOperacionComboBox.getSelectedItem();
        if (operacion != null) {
            //Si la operación no es retiro de efectivo, deshabilitamos el campo observaciones.
            if (!operacion.getOperacion().equals("RETIRO DE EFECTIVO")) {
                observacionesField.setEditable(false);
                //Caso contrario, habilitarlo para completar a mano.
            } else {
                observacionesField.setEditable(true);
            }
        }
    }//GEN-LAST:event_tipoOperacionComboBoxActionPerformed

    public static void setearObservaciones(Alquileres alquilerRecibido) {
        String observaciones;
        alquiler = alquilerRecibido;
        observaciones = BalanceCaja.imprimirReferencia(alquilerRecibido.getTipoAlquiler()) + "ID: " + alquilerRecibido.getIdAlquiler();
        observacionesField.setText(observaciones);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(Usuarios usuario) {
        final Usuarios usuarioActual = usuario;
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MovimientosCaja.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MovimientosCaja.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MovimientosCaja.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MovimientosCaja.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        MovimientosCaja.frame = new MovimientosCaja(usuarioActual);
        java.awt.EventQueue.invokeLater(new Runnable() {
            /*
             * public void run() { new MovimientosCaja().setVisible(true); }
             */

            public void run() {
                frame.setTitle("Movimientos de Caja - SIAAT");
                //frame.setContentPane();
                frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                frame.pack();
                frame.setIconImage(new ImageIcon(getClass().getResource("/images/logo.png")).getImage());
                frame.setVisible(true);
                frame.addWindowListener(new WindowAdapter() {

                    public void windowClosing(WindowEvent e) {
                        if (frame != null) {
                            frame.setVisible(false);
                        }
                        frame = null;
                    }
                });
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.persistence.EntityManager SIAATPUEntityManager;
    private javax.swing.JButton buscarButton;
    private javax.swing.JTextField importeField;
    private javax.swing.JLabel importeLabel;
    private javax.swing.JComboBox monedaComboBox;
    private java.util.List<entities.Moneda> monedaList;
    private javax.persistence.Query monedaQuery;
    private javax.swing.JLabel movimientoCajaLabel;
    private static javax.swing.JTextField observacionesField;
    private java.util.List<entities.Operaciones> operacionesList;
    private javax.persistence.Query operacionesQuery;
    private javax.swing.JButton registrarButton;
    private javax.swing.JTextField responsableField;
    private javax.swing.JLabel responsableLabel;
    private javax.swing.JLabel responsableLabel1;
    private static javax.swing.JComboBox tipoOperacionComboBox;
    private javax.swing.JLabel tipoOperacionLabel;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration//GEN-END:variables
}
